var express = require('express')
var router = express.Router()

// 导入用户集合的字段的数据模型、导入生成token的模块
var userModel = require('../model/user/UserModel')
var addrModel = require('../model/addrs/AddressModel')
var http = require('../utils/http')
var jwt = require('../utils/jwt')


/**
 * 描述：创建管理用户集合的api
 * 请求地址：/list
 * 请求方式：get
 * 请求参数：page(页码)、size(用户量)、username(用户名)
 * 响应参数：total(总用户量)、list(用户列表)
 * get请求，参数解析使用query方法
 * post请求，参数解析使用body方法
*/
router.get('/list', (req, res, next) => {
  let { username, page, size } = req.query

  // 请求参数不是必填，需要给定参数
  page = parseInt(page || 1)
  size = parseInt(size || 10)
  username = username || ''

  // tips：这里匹配正则表达式要用实例类方式
  userModel.find({username: new RegExp(username)})
  .skip( (page - 1) * size )
  .limit(size)
  .then(data => {
    res.json({ err: 0, msg: 'success', data })
  })
})

/**
 * 描述：创建用于登录的api
 * 请求地址：/login
 * 请求方式：post
 * 请求参数：username(用户名)、password(密码)、comfirm_pwd(确认密码)
 * 响应参数：生成token、建权
*/
router.post('/login', (req, res, next) => {
  let { username, password } = req.body
  let reg1 = /^[a-zA-Z][a-zA-Z0-9\~\!\@]{3,9}$/
  let reg2 = /^[0-9]{0,8}$/
  if (!reg1.test(username)) {
    return res.json({ err: 1, msg: '用户名不符合要求' })
  }
  if (!reg2.test(password)) {
    return res.json({ err: 1, msg: '密码输入不正确' })
  }

  // 连接user集合，判断用户名和密码是否一致
  userModel.find({username, password})
  .then(item => {
    if (item.length > 0) {
      // 用户登录成功后，需要为该用户提供一个唯一的身份标识token
      res.json({
        err: 0, msg: 'success', 
        data: { token: jwt.createToken({username, password, _id: item[0]._id}) }
      })
    } else {
      res.json({ err: 2, msg: '用户名或密码不存在' })
    }
  })
})


/**
 * 描述：创建用于注册的api
 * 请求地址：/register
 * 请求方式：post
 * 请求参数：username(用户名)、password(密码)、comfirm_pwd(确认密码)
 * 响应参数：生成token、建权
*/
router.post('/register', (req, res, next) => {
  let {username, password, comfirm_pwd} = req.body
  let reg1 = /[\u4E00-\u9FA5]{2,8}/
  let reg2 = /^[0-9]{0,8}$/
  if (!reg1.test(username)) {
    return res.json({ err: 1, msg: '用户名不符合要求' })
  }
  if (!reg2.test(password)) {
    return res.json({ err: 1, msg: '密码输入不正确' })
  } else if (password !== comfirm_pwd) {
    return res.json({ err: 1, msg: '两次输入不正确' })
  }

  userModel.find({username})
  .then(item => {
    if (item.length > 0) {
      return res.json({ err: 1, msg: '该用户名已被占用' })
    }
    let params = {
      username,
      password,
      create_time: Date.now()
    }
    // 当符合条件时将用户名和密码添加到数据库中
    userModel.insertMany([params])
    .then(() => {
      return res.json({ err: 0, msg: 'success', data: {params} })
    })
  })
})

/**
 * 描述：用户登录成功后，返回给用户相关的信息
 * 请求地址：/info
 * 请求方式：get
 * 请求参数：token
*/
router.get('/info', (req, res) => {
  jwt.verifyToken(req, res).then(e => {
    userModel.findOne({_id: e._id}).then(user => {
      const data = {
        roles: [user.role],
        role: user.role,
        introduction: user.username,
        avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
        name: user.username
      }
  
      res.json({ err: 0, msg: 'success',  data})
    })
  })
})

/**
 * 描述：判断数据库中用户名是否重复
 * 请求地址：/exist
 * 请求方式：get
 * 请求参数：username
*/
router.get('/exist', (req, res) => {
  jwt.verifyToken(req, res).then(() => {
    let { username } = req.query
    userModel.find({username}).then(data => {
      res.json({ err: 0, msg: 'success', data })
    })
  })
})

/**
 * 描述：用于新增用户
 * 请求地址：/add
 * 请求方式：post
*/
router.post('/add', (req, res) => {
	jwt.verifyToken(req, res).then(() => {
		let { username, password, create_time, role } = req.body
		console.log(req.body)
		const data = {
			username,
			password,
			create_time,
			role
		}
		userModel.insertMany([data]).then(() => {
			res.json({ err: 0, msg: 'success' })
		})
	})
})

/**
 * 描述：请求用户地址的相关信息
 * 请求地址：/addr
 * 请求方式：get
 * 请求参数：用户的id
*/
router.get('/addr', (req, res) => {
  jwt.verifyToken(req, res).then(e => {
    addrModel.find({ user_id: e._id }).then(data => {
      console.log( data )
      res.json({ err: 0, msg: 'success', data: { data } })
    })
  })
})

/**
 * 描述：创建用户的地址信息
 * 请求地址：/newaddr
 * 请求方式：post
 * 请求参数：name(姓名), tel(电话), address(地址), 
 *          isDefault(默认地址), postCode(邮政编码)
 * 响应参数：
*/
router.post('/newaddr', (req, res) => {
  jwt.verifyToken(req, res).then(e => {
    let { name, tel, address, isDefault, postCode } = req.body
    const data = {
      user_id: e._id,
      name,
      tel,
      address,
      isDefault,
      postCode
    }

    addrModel.insertMany([data]).then(() => {
      res.json({ err: 0, msg: 'success', data: {} })
    })
  })
})

module.exports = router
